import CryptoJS from 'crypto-js'
import { showToast, navigateTo, redirectTo, switchTab } from '@/utils'
import { useMemberStore } from '@/stores'
import { getUserInfo } from '@/pages/my/utils'
import { getIMApi } from '@/services/my/login'
import { loginByWechatApi } from '@/services/my/login'
import { ENV } from '@/utils/http'
import { ref } from 'vue'
const currentPage = ref()
const os = ref()
uni.getSystemInfo({
  success: (e) => {
    os.value = e.osName
    console.log(e)
  },
})
/**
 * @description: 微信登录
 */
export function loginByWechat(methods) {
  uni.login({
    provider: 'weixin',
    onlyAuthorize: true,
    success(e) {
      _Utils.loginByWechat(e.code, methods)
    },
    fail(err) {
      methods._fail(err)
      showToast('微信授权失败')
    },
  })
}
/**
 * @description: 一键登录
 */
export function loginByOauth(methods) {
  const userStore = useMemberStore()
  let pages = getCurrentPages() // 获取当前页面栈
  if (userStore.token) return
  if (pages?.length > 1) {
    currentPage.value = pages[pages.length - 1].route // 上一页为栈顶第二个元素
  }

  // #ifdef APP-PLUS || APP-IOS
  _Utils.OpenAuthView(methods)
  //   // #endif

  // #ifdef H5
  methods._onOtherLogin()
  // #endif
}

class _Utils {
  // 打开授权页面
  static OpenAuthView(methods) {
    uni.login({
      provider: 'univerify',
      univerifyStyle: _Utils.LoginConfig(),
      success(res) {
        console.log('打开授权页面', res)
        _Utils.Cloud(methods, res)
      },
      fail(err) {
        console.log('打开授权页面失败', err)
        _Utils.LoginByOauthFail(methods, err)
      },
      complete() {},
    })
  }

  // 云函数
  static async Cloud(methods, params) {
    console.log(params, '6666666')
    try {
      const userStore = useMemberStore()
      // console.log(userStore?.casualUser)
      // console.log('调用云函数前：methods', methods, ENV == 'pro' ? '' : ENV)
      const res = await uniCloud.callFunction({
        name: 'user-login',
        data: {
          url: `https://myblapp${ENV == 'pro' ? '' : ENV}.miyingbl.com/doctorapp/v1/login`,
          APPID: '__UNI__EEA0169',
          access_token: params?.authResult?.access_token,
          nickname: userStore?.casualUser?.nickname,
          equipment: userStore?.casualUser?.equipment,
          identity_type: userStore?.casualUser?.identity_type,
          identity_status: userStore?.casualUser?.identity_status,
          avatar: userStore?.casualUser?.avatar,
          openid: params.authResult.openid,
          registration_id: methods?.registration_id,
          is_download_app: 1,
          source: os.value == 'ios' ? 2 : 1,
        },
      })
      console.log(
        '调用云函数传的参数',
        params.authResult.access_token,
        userStore?.casualUser?.nickname,
        userStore?.casualUser?.avatar,
        params.authResult.openid,
      )
      const cloud_resopnse = res.result
      console.log('云函数返回：', cloud_resopnse)
      if (cloud_resopnse.code == 200 && cloud_resopnse.data.token) {
        userStore.setToken(cloud_resopnse.data.token)
        console.log(cloud_resopnse.data.token, '6666666666666666666')
        getUserInfo()
        _Utils.Success(methods)

        _Utils.GetIM(res.result)
      } else if (cloud_resopnse.status == 500 && cloud_resopnse.message === '账号不存在') {
        showToast('请先注册')
        redirectTo('/pages-users/login-page/register', 0)
        _Utils.CloseAuthView()
      } else {
        _Utils.Fail(cloud_resopnse.message, methods)
      }
    } catch (error) {
      console.log('Cloud-error', error)
      _Utils.Fail(error?.message, methods)
    }
  }

  // 获取IM
  static async GetIM(userStores) {
    const userStore = useMemberStore()
    try {
      const res = await getIMApi({ doctor_im_id: userStores?.data?.im?.doctor_im_id })
      // console.log('获取IM失败', res, '898989')
      userStore.setIM(res.data)
    } catch (error) {
      console.log('获取IM失败', error)
    }
  }

  // ECB-BASE64-128
  static EncryptByDES(number) {
    const key = 'qupdR6PpfP48FcLo6B6p'
    const keyHex = CryptoJS.enc.Utf8.parse(key)

    const encrypted = CryptoJS.DES.encrypt(number, keyHex, {
      mode: CryptoJS.mode.ECB,
      padding: CryptoJS.pad.Pkcs7,
    })

    return encrypted.toString()
  }

  static Success(methods, params = {}) {
    const store = useMemberStore()
    try {
      if (currentPage.value) {
        if (currentPage.value != 'pages-users/login-page/login') {
          const taburl = ['pages/index/index', 'pages/patient/patient', 'pages/my/index']
          if (taburl.findIndex((item) => item == currentPage.value) == 1) {
            uni.switchTab({
              url: currentPage.value,
            })
          } else {
            uni.redirectTo({ url: currentPage.value })
          }
        } else {
          switchTab('/pages/index/index')
        }
      }
      _Utils.CloseAuthView()
      showToast('登录成功')
      methods._success(params)
      setTimeout(() => {
        store.setclose(1)
      }, 300)
      console.log('-----------------')
    } catch (error) {}
  }

  static Fail(msg, methods) {
    methods._fail && methods._fail()
    showToast(msg || '登陆失败，请重试')
    _Utils.CloseAuthView()
  }

  static CloseAuthView() {
    setTimeout(() => {
      uni.closeAuthView()
    }, 500)
  }

  // 一键登录失败 or 用户点击了其他登录方式 or 用户关闭验证界面----------
  static LoginByOauthFail(methods, err) {
    const store = useMemberStore()
    console.log(store.islogin == 0, '执行了')
    store.setislogin(1)
    if (err.code === 30001) {
      // 用户点击了其他登录方式
      navigateTo('/pages-users/login-page/login?ll=1', 0)
    } else if (err.code === 30002) {
      // 用户点击了其他登录方式
      methods._onOtherLogin()
      _Utils.CloseAuthView()
    } else if (err.code === 30003) {
      const store = useMemberStore()
      if (!store?.token) {
        // #ifdef  APP-IOS
        navigateTo('/pages-users/login-page/login?ll=1', 0)
        // #endif
        showToast('请先登录！')
      } else {
        if (currentPage.value) {
          if (currentPage.value != 'pages-users/login-page/login') {
            const taburl = ['pages/index/index', 'pages/patient/patient', 'pages/my/index']

            if (taburl.findIndex((item) => item == currentPage.value) == 1) {
              uni.switchTab({
                url: currentPage.value,
              })
            } else {
              uni.redirectTo({ url: currentPage.value })
            }
          } else {
            uni.navigateBack({ delta: 1 })
          }
        }
        _Utils.CloseAuthView()
        setTimeout(() => {
          store.setclose(1)
        }, 300)
      }
      // 用户关闭验证界面
    } else if (err.code == 30006) {
      const store = useMemberStore()
      if (!store?.token) {
        navigateTo('/pages-users/login-page/login?ll=1', 0)
        showToast('请先登录！')
      }
      // 用户点击了返回
    } else if (err.code == 30008) {
      if (err.index == 0) {
        // 微信登录
        methods._onOtherLogin()
      } else if (err.index == 1) {
        // 手机号登录
        navigateTo('/pages-users/login-page/login?ll=1', 0)
      }
    } else {
      methods._fail(err)
    }
  }

  // 微信登录
  static async loginByWechat(code, methods) {
    try {
      const res = await loginByWechatApi({
        code,
      })
      if (res.code == 200) {
        const userStore = useMemberStore()
        showToast('登录成功')
        userStore.setToken(res.data.token)
        methods._success(res.data)
        _Utils.GetIM(userStore)
      } else if (res.message === '账号不存在') {
        showToast('请先注册')
        redirectTo('/pages-users/login-page/register', 0)
        _Utils.CloseAuthView()
      } else {
        _Utils.Fail(res.message, methods)
      }
    } catch (error) {
      _Utils.Fail(error.message, methods)
    }
  }

  static LoginConfig() {
    return {
      fullScreen: true,
      icon: {
        path: `https://ossresource.miyingbl.com/uploads/20240620/h-bl-app/1718877148509?a=${Math.random()}`, // 自定义显示在授权框中的logo，仅支持本地图片 默认显示App logo
        width: '80px', //图标宽度 默认值：60px
        height: '80px', //图标高度 默认值：60px
      },
      authButton: {
        normalColor: '#00C1B9',
        highlightColor: '#75f5f0',
        disabledColor: '#D6E2E1', // 授权按钮不可点击时背景颜色 默认值：#73aaf5（仅ios支持）
        textColor: '#ffffff', // 授权按钮文字颜色 默认值：#ffffff
        title: '本机号码一键登录', // 授权按钮文案 默认值：“本机号码一键登录”
        borderRadius: '24px', // 授权按钮圆角 默认值："24px" （按钮高度的一半）
      },
      otherLoginButton: {
        visible: true, // 是否显示其他登录按钮，默认值：true
        normalColor: '', // 其他登录按钮正常状态背景颜色 默认值：透明
        highlightColor: '', // 其他登录按钮按下状态背景颜色 默认值：透明
        textColor: '#5C5C5C', // 其他登录按钮文字颜色 默认值：#656565
        title: '切换到验证码登录', // 其他登录方式按钮文字 默认值：“其他登录方式”
        borderColor: '', //边框颜色 默认值：透明（仅iOS支持）
        borderRadius: '0px', // 其他登录按钮圆角 默认值："24px" （按钮高度的一半）
      },
      privacyTerms: {
        defaultCheckBoxState: false, // 条款勾选框初始状态 默认值： true
        isCenterHint: true, //未勾选服务条款时点击登录按钮的提示是否居中显示 默认值: false (3.7.13+ 版本支持)
        uncheckedImage: 'static/my/login_no-check.png', // 可选 条款勾选框未选中状态图片（仅支持本地图片 建议尺寸 24x24px）(3.2.0+ 版本支持)
        checkedImage: 'static/my/login_check.png', // 可选 条款勾选框选中状态图片（仅支持本地图片 建议尺寸24x24px）(3.2.0+ 版本支持)
        checkBoxSize: 14, // 可选 条款勾选框大小
        textColor: '#5C5C5C', // 文字颜色 默认值：#BBBBBB
        termsColor: '#00C1B9', //  协议文字颜色 默认值： #5496E3
        prefix: '我已阅读并同意', // 条款前的文案 默认值：“我已阅读并同意”
        suffix: '并使用本机号码登录', // 条款后的文案 默认值：“并使用本机号码登录”
        privacyItems: [
          // 自定义协议条款，最大支持2个，需要同时设置url和title. 否则不生效
          {
            url: 'https://weapp.miyingbl.com/user.html',
            title: '《咪婴伴侣医生端用户协议》',
          },
          {
            url: 'https://weapp.miyingbl.com/xy.html',
            title: '《咪婴伴侣医生端隐私协议》',
          },
        ],
      },
      // buttons: {
      //   iconWidth: '140rpx',
      //   list: [
      //     //   {
      //     //     provider: 'weixin',
      //     //     iconPath: 'static/my/user-login-wechat-icon.png',
      //     //   },
      //     //   {
      //     //     provider: 'mobile',
      //     //     iconPath: 'static/my/login-by-mobile.png',
      //     //   },
      //   ],
      // },
    }
  }
}
